home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 February: Tool Chest / Apple Developer CD Series Tool Chest February 1996 (Apple Computer)(1996).iso / Tool Chest / Development Tools & Languages / Dylan Related / Marlais / MacMarlais 0.5.9d46 / Examples / fact.dyl < prev    next >
Encoding:
Text File  |  1995-02-11  |  1.3 KB  |  73 lines  |  [TEXT/Mrls]

  1. module:            dylan-user
  2. author:            Patrick C. Beard (beard@cs.ucdavis.edu)
  3. copyright:        (C) 1994-1995 Patrick C. Beard
  4.                 All rights reserved.
  5. synopsis:        demonstration of recursion alternatives.
  6. version:            1.0
  7.  
  8. //
  9. // DIRM syntax implementations of recursive factorial and fibonacci functions.
  10. //
  11.  
  12. define method fact (n :: <integer>) => <integer>;
  13.     if (n = 0)
  14.         1;
  15.     else
  16.         n * fact(n - 1);
  17.     end if;
  18. end method fact;
  19.  
  20. define method fact-iter (n :: <integer>) => <integer>;
  21.     let f = 1;
  22.     for (i from 2 to n)
  23.         f := f * i;
  24.     finally
  25.         f;
  26.     end for;
  27. end method fact-iter;
  28.  
  29. define method fact-acc (n :: <integer>) => <integer>;
  30.     local method fact-helper (f, n)
  31.         if (n = 1)
  32.             f;
  33.         else
  34.             fact-helper(n * f, n - 1);
  35.         end if;
  36.     end method;
  37.     fact-helper(1, n);
  38. end method fact-acc;
  39.  
  40. define method fib (n :: <integer>) => <integer>;
  41.     if (n = 0 | n = 1)
  42.         1;
  43.     else
  44.         fib(n - 2) + fib(n - 1);
  45.     end if;
  46. end method fib;
  47.  
  48. define method fib-iter (n :: <integer>) => <integer>;
  49.     let (f0, f1, f) = values(1, 1, 1);
  50.     for (i from 2 to n)
  51.         f := f0 + f1;
  52.         f0 := f1;
  53.         f1 := f;
  54.     finally
  55.         f;
  56.     end for;
  57. end fib-iter;
  58.  
  59. define method fib-acc (n :: <integer>) => <integer>;
  60.     if (n = 0 | n = 1)
  61.         1;
  62.     else
  63.         local method fib-helper (f0, f1, n)
  64.             if (n = 2)
  65.                 f0 + f1;
  66.             else
  67.                 fib-helper (f1, f0 + f1, n - 1);
  68.             end if;
  69.         end method;
  70.         fib-helper(1, 1, n);
  71.     end if;
  72. end method fib-acc;
  73.